"""
Case Type   : gs_checkse工具功能
Case Name   : 验证gs_checkse的A6检测项确保开启数据库审计功能检测与修复成功
Create At   : 2024/10/28
Owner       : lihongji
Description :
    1.设置audit_enabled参数为on后检测A6项
    2.对正确项B6修复后查看audit_enabled的值
    3.设置audit_enabled参数为off后检测A6项
    4.修复A6不符合安全规范项目后再次检测
    5.在数据库查看audit_enabled的值
Expect      :
    1.设置成功，检测不打印告警信息
    2.修复成功，查看audit_enabled的值为on
    3.设置成功，打印告警信息
    4.修复成功，不打印告警信息
    5.audit_enabled为on
History     :
"""
import os
import time
import unittest

from testcase.utils.Logger import Logger
from testcase.utils.Common import Common
from testcase.utils.CommonSH import CommonSH
from testcase.utils.Constant import Constant
from yat.test import Node
from yat.test import macro


class GS_CHECKSE(unittest.TestCase):
    def setUp(self):
        self.log = Logger()
        self.log.info(f'----{os.path.basename(__file__)} start----')
        self.primaryNode = Node('PrimaryDbUser')
        self.sh_primary = CommonSH('PrimaryDbUser')
        self.constant = Constant()
        self.common = Common()
        self.env_path = macro.DB_ENV_PATH

    def test_gscheckse(self):
        step = ('----step1:设置audit_enabled参数为on后检测A6项'
                'expect:设置成功，检测不打印告警信息----')
        self.log.info(step)
        excute_msg = self.sh_primary.execute_gsguc(
            'reload', self.constant.GSGUC_SUCCESS_MSG, "audit_enabled=on")
        self.assertTrue(excute_msg)
        gs_checkse_cmd = (f'source {self.env_path};'
                          f'gs_checkse -i A6 --detail')
        self.log.info(gs_checkse_cmd)
        check_res = self.common.get_sh_result(self.primaryNode, gs_checkse_cmd)
        self.assertNotIn("Ensure database auditing functionality is "
                         "enabled.", check_res, '执行失败' + step)

        step = ('----step2:对正确项B6修复后查看audit_enabled的值 '
                'expect:修复成功，查看audit_enabled的值为on----')
        self.log.info(step)
        gs_checkse_cmd = (f'source {self.env_path};'
                          f'gs_checkse -i B6 --detail;')
        self.log.info(gs_checkse_cmd)
        check_res = self.common.get_sh_result(self.primaryNode, gs_checkse_cmd)
        check_sql = "show audit_enabled;"
        create_res = self.sh_primary.execut_db_sql(check_sql)
        self.log.info(create_res)
        self.assertIn('on', create_res, '执行失败' + step)
        self.assertIn("Setting Database auditing succeed.",
                      check_res, '执行失败' + step)

        step = ('----step3:设置audit_enabled参数为off后检测A6项 '
                'expect:设置成功，打印告警信息')
        self.log.info(step)
        excute_msg = self.sh_primary.execute_gsguc(
            'reload', self.constant.GSGUC_SUCCESS_MSG,
            "audit_enabled=off")
        self.assertTrue(excute_msg)
        gs_checkse_cmd = (f'source {self.env_path};'
                          f'gs_checkse -i A6 --detail')
        self.log.info(gs_checkse_cmd)
        check_res = self.common.get_sh_result(self.primaryNode, gs_checkse_cmd)
        self.assertIn("Ensure database auditing functionality is "
                      "enabled.", check_res, '执行失败' + step)

        step = ('----step4:修复A6不符合安全规范项目后再次检测  '
                'expect:修复成功，不打印告警信息---')
        self.log.info(step)
        gs_checkse_cmd = (f'source {self.env_path};'
                          f'gs_checkse -i B6 --detail;'
                          f'gs_checkse -i A6 --detail;')
        self.log.info(gs_checkse_cmd)
        check_res = self.common.get_sh_result(self.primaryNode, gs_checkse_cmd)
        self.assertIn("Setting Database auditing succeed.",
                      check_res, '执行失败' + step)
        self.assertNotIn("Ensure database auditing functionality is "
                         "enabled.", check_res, '执行失败' + step)

        step = ('----step5:在数据库查看audit_enabled的值'
                'expect:audit_enabled为on----')
        self.log.info(step)
        check_sql = "show audit_enabled;"
        create_res = self.sh_primary.execut_db_sql(check_sql)
        self.log.info(create_res)
        self.assertIn('on', create_res, '执行失败' + step)

    def tearDown(self):
        step = '----step6:清理环境 expect:成功----'
        self.log.info(step)
        revoke = self.sh_primary.execute_gsguc(
            'reload', self.constant.GSGUC_SUCCESS_MSG,
            "audit_enabled=on")
        self.assertTrue(revoke)
        self.log.info(f'----{os.path.basename(__file__)} end----')